﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;
using Siser.Web.Authorization;
using Siser.Web.Security;
using System.IO;
using System.Configuration;
using Siser.Web.Shared;
using System.Data.Entity.Validation;
using System.Diagnostics;
using System.Collections;
using System.Threading;

namespace Siser.Web.Controllers
{
    public class MantencionController : Controller
    {

        private SiserEntities db = new SiserEntities();

        public ActionResult Index()
        {
            var info = new System.Diagnostics.ProcessStartInfo("CMD.exe", "/C net start>C:\\Servicio\\Servicios.txt");
            info.Verb = "open";
            info.WindowStyle = ProcessWindowStyle.Hidden;
            System.Diagnostics.Process.Start(info);
            //codigo que crea el archivo con los servicios que estan corriendo en el sistema.
            var last = (from ser in db.Servicio_consulta
                        orderby ser.Fecha_hora descending
                        select ser).ToList();
            List<Servicio_consulta> consul= new List<Servicio_consulta>();
            foreach (var n in last)
            {
                Servicio_consulta sc = new Servicio_consulta();
                sc.Fecha_hora = n.Fecha_hora;
                consul.Add(sc);
            }

            return View(consul);

        }

        public ActionResult EstadoServicio()
        {
            DateTime actual = DateTime.Now;
            Servicio_consulta var=new Servicio_consulta();
            var.Fecha_hora=actual;
            db.Servicio_consulta.Add(var);
            db.SaveChanges();
            StreamReader objReader = new StreamReader("c:\\Servicio\\Servicios.txt");
            string sLine = "";
            ArrayList arrText = new ArrayList();

            while (sLine != null)
            {
                sLine = objReader.ReadLine();
                if (sLine != null)
                    arrText.Add(sLine);
            }
            objReader.Close();

            foreach (string sOutput in arrText)
            {
                if (sOutput == "   SW de Comunicacion")
                {
                    ViewBag.color = "V";
                    ViewBag.texto = "Software de comunicación en ejecución...";
                    break;
                }
                else
                {
                    ViewBag.texto = "Software de comunicación detenido...";
                    ViewBag.color = "F";
                }
            }

            return View();

        }


        public ViewResult TramasError()
        {

            var Trama=(from te in db.error_trama
                       orderby te.fecha_error descending
                       select te).ToList();

            List<error_trama> ltrama = new List<error_trama>();
            if (Trama.Count !=0)
            {
                
                foreach (var tra in Trama)
                {
                    error_trama p = new error_trama();
                    p.fecha_error = tra.fecha_error;
                    p.trama_error = tra.trama_error;
                    ltrama.Add(p);
                }
                return View(ltrama);
            }
            else
            {
                error_trama p = new error_trama();
                p.trama_error = "No hay tramas con error";
                ltrama.Add(p);
                return View(ltrama);
            }
        }

        public ViewResult ServerError()
        {
            DateTime hoy = DateTime.Today;
            string fecha = hoy.ToString("dd-MM-yyyy");

            var servidores = (from med in db.Mediciones
                             join pie in db.Piezas on med.PiezaId equals pie.Id
                             join ep in db.EquiposPiezas on pie.Id equals ep.PiezaId
                             join e in db.Equipos on ep.EquipoId equals e.Id
                             join sis in db.Sistemas on e.SistemaId equals sis.Id
                             join ins in db.Instalaciones on e.InstalacionId equals ins.Id
                             join pl in db.Plantas on ins.PlantaId equals pl.Id
                             where med.Fecha>=hoy
                             select new {
                                            planta=pl.Nombre,
                                            sistema=sis.Nombre
                             }).Distinct().ToList();

                var servidoresErr = (from pie in db.Piezas
                                     join ep in db.EquiposPiezas on pie.Id equals ep.PiezaId
                                     join e in db.Equipos on ep.EquipoId equals e.Id
                                     join sis in db.Sistemas on e.SistemaId equals sis.Id
                                     join ins in db.Instalaciones on e.InstalacionId equals ins.Id
                                     join pl in db.Plantas on ins.PlantaId equals pl.Id
                                     select new
                                     {
                                         planta1 = pl.Nombre,
                                         sistema1 = sis.Nombre
                                     }).Distinct().ToList();

            List<error_trama> nuevo = new List<error_trama>();
            if (servidores.Count != 0)
            {             
            
            foreach(var aux in servidoresErr)
                {   
                    error_trama n = new error_trama();
                    n.plantaserv =aux.planta1;
                    n.region = aux.sistema1;
                    foreach(var pru in servidores)
                    {
                        if ((aux.planta1 == pru.planta) && (aux.sistema1 == pru.sistema))
                        {
                            n.estadoserv = "Activo";
                            break;
                        }
                        else
                            n.estadoserv = "Inactivo";
                    }

                    nuevo.Add(n);
                }
                ViewBag.fecha = fecha;
                return View(nuevo);
            }
            else
            {
                error_trama n = new error_trama();
                n.plantaserv = "";
                n.region = "Sin respuesta de los servidores de área...";
                nuevo.Add(n);
                ViewBag.fecha = fecha;
                return View(nuevo);
            }
        }


        public ViewResult UltimaTrama()
        {
            DateTime hoy = DateTime.Today;
            string fecha = hoy.ToString("dd-MM-yyyy");
            ViewBag.fecha = fecha;
            return View(db.Ultimoes.ToList());
        }


        public ViewResult TramasRecibidas()
        {
            DateTime hoy = DateTime.Today;
            string fecha = hoy.ToString("dd-MM-yyyy");

            var ultimo = (from m in db.Mediciones
                          from pie in db.Piezas
                          from ep in db.EquiposPiezas
                          from e in db.Equipos
                          from sis1 in db.Sistemas
                          from ins in db.Instalaciones
                          from pl1 in db.Plantas
                          where m.Fecha >= hoy
                          && m.PiezaId == pie.Id
                          && ep.PiezaId == pie.Id
                          && ep.EquipoId == e.Id
                          && e.SistemaId == sis1.Id
                          && e.InstalacionId == ins.Id
                          && ins.PlantaId == pl1.Id
                          group new { m, pie, sis1, pl1 } by new
                          {
                              Column0 = pie.Nombre,
                              Column1 = sis1.Nombre,
                              Column2 = pl1.Nombre,
                              Column4 = m.Origen
                          } into g
                          orderby g.Key.Column2
                          orderby g.Key.Column1
                          select new
                          {
                              Column = g.Max(p => p.m.Fecha),
                              Column0 = g.Key.Column0,
                              Column3 = g.Key.Column2,
                              Column2 = g.Key.Column1,
                              Column4=g.Key.Column4

                          }).ToList();

            List<error_trama> nuevo1 = new List<error_trama>();

            if (ultimo.Count != 0)
            {

                foreach (var datos1 in ultimo)
                {
                    error_trama n1 = new error_trama();
                    n1.fecha = datos1.Column;
                    n1.pieza = datos1.Column0;
                    n1.planta = datos1.Column3;
                    n1.sistema = datos1.Column2;
                    n1.origen = datos1.Column4;
                    n1.estado = "Activo";
                    nuevo1.Add(n1);
                }

                var noAparece = (from pie in db.Piezas
                                 join ep in db.EquiposPiezas on pie.Id equals ep.PiezaId
                                 join e in db.Equipos on ep.EquipoId equals e.Id
                                 join sis in db.Sistemas on e.SistemaId equals sis.Id
                                 join ins in db.Instalaciones on e.InstalacionId equals ins.Id
                                 join pl in db.Plantas on ins.PlantaId equals pl.Id
                                 where !(from m in db.Mediciones
                                         where m.Fecha >= hoy
                                         select m.PiezaId).Contains(pie.Id)
                                orderby pl.Nombre
                                orderby sis.Nombre
                                select new
                                {
                                    colum=pie.Nombre,
                                    colum0=pl.Nombre,
                                    colum1=sis.Nombre

                                }).ToList();


                if (noAparece.Count != 0)
                {

                    foreach (var datos2 in noAparece)
                    {
                        error_trama n2 = new error_trama();
                        n2.fecha = Convert.ToDateTime("01-01-2001");
                        n2.pieza = datos2.colum;
                        n2.planta = datos2.colum0;
                        n2.sistema = datos2.colum1;
                        n2.origen = "";
                        n2.estado = "Inactivo";
                        nuevo1.Add(n2);
                    }

                }

                ViewBag.fecha = fecha;
                return View(nuevo1);
            }
            else
            {
                error_trama n = new error_trama();
                n.plantaserv = "";
                n.region = "Sin tramas recibidas de servidores de área...";
                nuevo1.Add(n);
                ViewBag.fecha = fecha;
                return View(nuevo1);
            }
        }


        public ViewResult UltimaHora()
        {
            DateTime hoy = DateTime.Now;
            string fecha = hoy.ToString();
            DateTime menos = DateTime.Now - new TimeSpan(1, 0, 0);
            string fecha2 = menos.ToString();
            


                var noAparece = (from pie in db.Piezas
                                 join ep in db.EquiposPiezas on pie.Id equals ep.PiezaId
                                 join e in db.Equipos on ep.EquipoId equals e.Id
                                 join sis in db.Sistemas on e.SistemaId equals sis.Id
                                 join ins in db.Instalaciones on e.InstalacionId equals ins.Id
                                 join pl in db.Plantas on ins.PlantaId equals pl.Id
                                 where !(from m in db.Mediciones
                                         where m.Fecha >= menos && m.Fecha<=hoy
                                         select m.PiezaId).Contains(pie.Id)
                                orderby pl.Nombre
                                orderby sis.Nombre
                                select new
                                {
                                    col=pie.Nombre,
                                    col0=pl.Nombre,
                                    col1=sis.Nombre

                                }).ToList();

                List<error_trama> sintrama = new List<error_trama>();

                if (noAparece.Count != 0)
                {

                    foreach (var datos2 in noAparece)
                    {
                        error_trama n2 = new error_trama();
                        n2.piezap = datos2.col;
                        n2.plantap = datos2.col0;
                        n2.sistemap = datos2.col1;
                        n2.origenp = "";
                        n2.estadop = "Sin trama recibidas por período";
                        sintrama.Add(n2);
                    }
                   ViewBag.fecha = fecha;
                   ViewBag.fecha2 = fecha2;
                   return View(sintrama);
                }
                else
                {
                    error_trama n = new error_trama();
                    n.plantaserv = "";
                    n.region = "Freccuencia de recepción dentro del rango de 1 hora...";
                    sintrama.Add(n);
                    ViewBag.fecha = fecha;
                    ViewBag.fecha2 = fecha2;
                    return View(sintrama);
                }
        }



    }
}
